package com.yunhe.java.others;
import java.awt.*;
import java.awt.event.*;

import javax.swing.JFrame;
/**
 * Created by Administrator on 2017/7/28 0028.
 */
public class Jisuanqi {
        public static void main(String[] args) {
            @SuppressWarnings("unused")
            final JsqFrame f;
            f = new JsqFrame();
        }
    }

    class JsqFrame extends JFrame {

        private static final long serialVersionUID = 1L;
        double d1, d2;
        int op = -1;
        TextField tf;
        CalPanelL p1;
        CalPanelR p2;

        // Constructor
        JsqFrame() {
            super("计算器");
            setLayout(new FlowLayout());
            setResizable(true);
            setSize(300,200);
            tf = new TextField(22);
            tf.setEditable(false);
            tf.setBackground(new Color(130, 130, 130));
            tf.setForeground(Color.white);
            tf.setFont(new Font("Arial",Font.BOLD,16));
            add(tf);
            p1 = new CalPanelL();
            p2 = new CalPanelR();
            add(p1);
            add(p2);
            setVisible(true);
            //addWindowListener(new Wclose());
        }

        // inner class:CalButton
        class CalButton extends Button {
            CalButton(String s){
                super(s);
                setBackground(Color.gray);
            }
        }

        // inner class: CalPanelL
        class CalPanelL extends Panel {
            CalButton b0, b1, b2, b3,
                    b4, b5, b6, b7,
                    b8, b9, bPN, bPoint;
            CalPanelL() {
                setLayout(new GridLayout(4,3));
                setFont(new Font("TimesRoman",Font.BOLD,16));
                b0 = new CalButton("0");
                b1 = new CalButton("1");
                b2 = new CalButton("2");
                b3 = new CalButton("3");
                b4 = new CalButton("4");
                b5 = new CalButton("5");
                b6 = new CalButton("6");
                b7 = new CalButton("7");
                b8 = new CalButton("8");
                b9 = new CalButton("9");
                bPN = new CalButton("+/-");
                bPoint = new CalButton(".");
                // 加入按钮
                add(b7); b7.addActionListener(new PressB7());
                add(b8); b8.addActionListener(new PressB8());
                add(b9); b9.addActionListener(new PressB9());
                add(b4); b4.addActionListener(new PressB4());
                add(b5); b5.addActionListener(new PressB5());
                add(b6); b6.addActionListener(new PressB6());
                add(b1); b1.addActionListener(new PressB1());
                add(b2); b2.addActionListener(new PressB2());
                add(b3); b3.addActionListener(new PressB3());
                add(b0); b0.addActionListener(new PressB0());
                add(bPN); bPN.addActionListener(new PressBPN()); ;
                add(bPoint); bPoint.addActionListener(new PressBPoint());
            }
        }

        class CalPanelR extends Panel {
            CalButton bAdd, bSub, bMul, bDiv,
                    bLn, bEqual, bCE, bQuit;
            CalPanelR() {
                setLayout(new GridLayout(4,2));
                setFont(new Font("TimesRoman",Font.BOLD,16));
                bAdd = new CalButton("+");
                bSub = new CalButton("-");
                bMul = new CalButton("*");
                bDiv = new CalButton("/");
                bLn = new CalButton("ln");
                bEqual = new CalButton("=");
                bCE = new CalButton("CE");
                bQuit = new CalButton("退出");
                add(bDiv); bDiv.addActionListener(new PressBDiv());
                add(bCE); bCE.addActionListener(new PressBCE());
                add(bMul); bMul.addActionListener(new PressBMul());
                add(bLn); bLn.addActionListener(new PressBLn());
                add(bSub); bSub.addActionListener(new PressBSub());
                add(bEqual); bEqual.addActionListener(new PressBEqual());
                add(bAdd); bAdd.addActionListener(new PressBAdd());
                add(bQuit); bQuit.addActionListener(new PressBQuit());
            }
        }

        class PressBAdd implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                try {
                    d1 = Double.parseDouble(tf.getText());
                    op = 0;
                    tf.setText("");
                } catch(Exception ee) {}
            }
        }

        class PressBSub implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                try {
                    d1 = Double.parseDouble(tf.getText());
                    op = 1;
                    tf.setText("");
                } catch(Exception ee) {}
            }
        }


        class PressBMul implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                try {
                    d1 = Double.parseDouble(tf.getText());
                    op = 2;
                    tf.setText("");
                } catch(Exception ee) {}
            }
        }

        class PressBDiv implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                try {
                    d1 = Double.parseDouble(tf.getText());
                    op = 3;
                    tf.setText("");
                } catch(Exception ee) {}
            }
        }

        class PressBEqual implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                try {
                    double result = 0;
                    d2 = Double.parseDouble(tf.getText());
                    switch(op) {
                        case 0:
                            result = d1 + d2;
                            break;
                        case 1:
                            result = d1 - d2;
                            break;
                        case 2:
                            result = d1 * d2;
                            break;
                        case 3:
                            result = d1 / d2;
                            break;
                        case 4:
                            result = Math.pow(d1,d2);
                            break;
                        default:
                    }
                    tf.setText(String.valueOf(result));
                } catch(Exception ee) {}
            }
        }

        class PressBLn implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                try {
                    double x = Double.parseDouble(tf.getText());
                    double y;
                    y = Math.log(x);
                    tf.setText(y+"");
                } catch(Exception ee) {}
            }
        }

        class PressBCE implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                tf.setText("");
            }
        }

        class PressBPN implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                try {
                    String text = tf.getText();
                    if (text != "") {
                        if(text.charAt(0) == '-')
                            tf.setText(text.substring(1));
                        else if(text.charAt(0) >= '0' && text.charAt(0) <= '9')
                            tf.setText("-"+text.substring(0));
                        else if(text.charAt(0) == '.')
                            tf.setText("-0"+text.substring(0));
                    }
                } catch(Exception ee) { }

            }
        }

        class PressBPoint implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                String text = tf.getText();
                if(text.lastIndexOf(".") == -1)
                    tf.setText(text+".");
            }
        }

        class PressB0 implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                String text = tf.getText();
                tf.setText(text+"0");
            }
        }

        class PressB1 implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                String text = tf.getText();
                tf.setText(text+"1");
            }
        }

        class PressB2 implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                String text = tf.getText();
                tf.setText(text+"2");
            }
        }

        class PressB3 implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                String text = tf.getText();
                tf.setText(text+"3");
            }
        }

        class PressB4 implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                String text = tf.getText();
                tf.setText(text+"4");
            }
        }

        class PressB5 implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                String text = tf.getText();
                tf.setText(text+"5");
            }
        }

        class PressB6 implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                String text = tf.getText();
                tf.setText(text+"6");
            }
        }

        class PressB7 implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                String text = tf.getText();
                tf.setText(text+"7");
            }
        }

        class PressB8 implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                String text = tf.getText();
                tf.setText(text+"8");
            }
        }

        class PressB9 implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                String text = tf.getText();
                tf.setText(text+"9");
            }
        }

        class PressBQuit implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        }

    }

